################################################################################
## Luke Taylor
## Heat Capacity Measurement Automation
################################################################################
## Revisions
## 08/12/2010 
##      - beg
##      - NOTE: DAC1 to chopper is roughly 25mV/Hz
################################################################################
## Packages
################################################################################
import serial
import k_meter_lnt
import lockin
from pylab import plot, semilogx, show, figure
from numpy import savetxt
## from scipy import stats
from easygui import enterbox
from time import sleep
from math import log10
################################################################################
## Globals
################################################################################
vcom = 10
lia_gpib = 12
keith_gpib = 24
keith_biascurr = 80e-6
wdir = 'C:\\Users\\luke\\Documents\\My Dropbox\\UMN_research\\pythons\\optical_coatings\\heat_parameters\\%s'
alpha = 0.0007  # resistor temperature coefficient
################################################################################
## Subroutines
################################################################################
def keith_setup():
    keith.reset()
    keith.raw.write(':SYST:BEEP:STAT OFF')
    keith.raw.write(':SOUR:FUNC CURR')
    keith.raw.write(':SOUR:CURR:MODE FIX')
    keith.raw.write(':SOUR:CURR:RANG 100E-6')
    keith.raw.write(':SOUR:CURR:LEV '+str(keith_biascurr))
    keith.raw.write(':SENS:VOLT:PROT 10')
    keith.raw.write(':SENS:FUNC "VOLT"')
    keith.raw.write(':SENS:VOLT:RANG 10')
    keith.raw.write(':OUTP ON')

def lia_setup():
    print "resetting lia"
    lia.reset('COM')
    print "changing to Single Reference Mode"
    lia.refMode(0)
    sleep(5)
    print "changing to External Front Panel Reference"
    lia.refExternal()
    print "Changing to A voltage input"
    lia.voltageInputMode(1)
    print "Changing to FET inputs"
    lia.fet_input()
    print "Changing TC to 100ms"
    print "settin back-panel DAC1 to 1V"
    lia.raw.write('DAC. 1 0.5')
    sleep(10)
    print "Setting up Auto measure"
    lia.autoMeasure()
    sleep(10)
    lia.tc(500e-3)

def sweep(vstart,vstep,fmax):
    data = []
    freq = 0.0
    dac1 = vstart
    lia.dacLevel(1,dac1)
    sleep(10)     
    print "starting sweep"
    while (freq < fmax) and (dac1 < 10.0):
        lia.dacLevel(1,dac1)
        sleep(5)                        #allow frequency to settle
        freq = float(lia.raw.ask('FRQ.'))
##         lia.autoMeasure()
##         sleep(5)                        #allow automeasure to settle
        vmag = float(lia.raw.ask('MAG.'))
        data.append([freq,vmag])
        print str(freq)+','+str(vmag)
        dac1 = dac1 + vstep
    return data
    
    

################################################################################
## Main
################################################################################
filename = enterbox(msg='enter csv filename', title='choose file', default='capacity.csv')
vcom_port = serial.Serial(vcom-1)

keith = k_meter_lnt.sourcemeter(keith_gpib,vcom_port)
## print keith.raw.ask('*idn?')

lia = lockin.lia726x(lia_gpib,vcom_port)
## print lia.raw.ask('id')

keith_setup()
lia_setup()
keith.raw.write(':OUTP ON')
data = sweep(25E-3,50E-3,300)
keith.raw.write(':OUTP OFF')
lia.raw.write('DAC 1 0')
## print data

fid = open(wdir %filename,'w')
fid.write('frequency,voltage\n')
savetxt(fid,data,delimiter=',',fmt='%1.4e')
fid.close()

fdata = data[:len(data)-1:2]
vdata = data[1:len(data):2]
dBdata = [20*log10(float(v)) for v in vdata]
semilogx(fdata,dBdata,'b+')
show()

vcom_port.close()
################################################################################
## EOF
################################################################################